package netty

import com.alibaba.fastjson.JSON
import com.data.ChatMsg
import io.netty.buffer.ByteBuf
import io.netty.channel.ChannelHandlerContext
import io.netty.channel.ChannelInboundHandlerAdapter
import io.netty.util.CharsetUtil
import io.netty.util.ReferenceCountUtil


object ClientHandler : ChannelInboundHandlerAdapter() {
    override fun channelActive(ctx: ChannelHandlerContext) {
        // 连接建立时的处理，发送请求消息给服务器
        println("连接建立")
        //ctx.writeAndFlush(Unpooled.copiedBuffer("你好，服务端！我是客户端，测试通道连接-建立链接", CharsetUtil.UTF_8))
        ctx.writeAndFlush("Hello,Server")
    }

    override fun channelRead(ctx: ChannelHandlerContext, msg: Any) {
        super.channelRead(ctx, msg)
        println("channelRead: $msg - ${msg.javaClass}")


        //        // 处理接收到的数据
        try {
            if (msg is ByteBuf) {
                // 将接收到的字节数据转换为字符串
                val message = msg.toString(CharsetUtil.UTF_8)
                // 打印接收到的消息
                println("收到服务端响应的消息: ${msg.javaClass}")
                println("收到服务端响应的消息: $message")
            } else if (msg is String) {
                val chatMsg: ChatMsg = JSON.parseObject(msg, ChatMsg::class.java)
                println("接收到服务端信息 chatMsg:$chatMsg")

                if (chatMsg.id > 1000) {
                    return
                }

                chatMsg.id = chatMsg.id + 1

                ctx.writeAndFlush(JSON.toJSONString(chatMsg))
            }
        } catch (e: Exception) {
            println("$msg $e")
        } finally {
            // 释放ByteBuf资源
            ReferenceCountUtil.release(msg)
        }

    }


    override fun exceptionCaught(ctx: ChannelHandlerContext, cause: Throwable) {
        println("exceptionCaught:$cause")
        // 异常处理
        cause.printStackTrace()
        ctx.close()
    }
}